SQL Injection

SQL Injection பற்றி அறிந்து, உங்கள் தரவுத்தளத்தை எவ்வாறு பாதுகாப்பாக வைத்திருப்பது என்பதைக் கற்றுக்கொள்ளுங்கள்

SQL Injection என்றால் என்ன?

SQL injection என்பது உங்கள் தரவுத்தளத்தை அழிக்கக்கூடிய ஒரு குறியீடு உட்செலுத்தும் நுட்பமாகும்.

SQL injection மிகவும் பொதுவான வலை ஹேக்கிங் நுட்பங்களில் ஒன்றாகும்.

SQL injection என்பது வலைப்பக்க உள்ளீடு மூலம் SQL அறிக்கைகளில் தீங்கிழைக்கும் குறியீட்டை வைப்பதாகும்.

⚠️ எச்சரிக்கை:

SQL Injection தாக்குதல்கள் உங்கள் தரவுத்தளத்தில் கடுமையான சேதத்தை ஏற்படுத்தக்கூடும், உணர்திறன் தரவைத் திருடவும், அட்டவணைகளை நீக்கவும் அல்லது முழு தரவுத்தளக் கட்டுப்பாட்டையும் பெறவும் முடியும்.

வலைப்பக்கங்களில் SQL

SQL injection பொதுவாக நீங்கள் ஒரு பயனரிடம் உள்ளீட்டைக் கேட்கும்போது ஏற்படுகிறது, அவர்களின் பயனர்பெயர்/பயனர் ஐடி போன்றவற்றைக் கேட்கும்போது, ஒரு பெயர்/ஐடிக்குப் பதிலாக, பயனர் உங்களுக்கு ஒரு SQL அறிக்கையை வழங்குகிறார், அதை நீங்கள் அறியாமல் உங்கள் தரவுத்தளத்தில் இயக்குவீர்கள்.

பின்வரும் உதாரணத்தைப் பாருங்கள், இது ஒரு மாறியை (txtUserId) ஒரு தேர்வு சரத்தில் சேர்ப்பதன் மூலம் ஒரு SELECT அறிக்கையை உருவாக்குகிறது. மாறி பயனர் உள்ளீட்டிலிருந்து பெறப்படுகிறது (getRequestString):

பாதிக்கப்படக்கூடிய குறியீடு:

txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;

இந்த அத்தியாயத்தின் மீதமுள்ள பகுதி SQL அறிக்கைகளில் பயனர் உள்ளீட்டைப் பயன்படுத்துவதன் சாத்தியமான ஆபத்துகளை விவரிக்கிறது.

1=1 அடிப்படையிலான SQL Injection எப்போதும் உண்மை

மேலே உள்ள உதாரணத்தை மீண்டும் பாருங்கள். குறியீட்டின் அசல் நோக்கம், கொடுக்கப்பட்ட பயனர் ஐடியுடன் ஒரு பயனரைத் தேர்ந்தெடுக்க ஒரு SQL அறிக்கையை உருவாக்குவதாகும்.

ஒரு பயனர் "தவறான" உள்ளீட்டை உள்ளிடுவதைத் தடுக்க எதுவும் இல்லை என்றால், பயனர் இதுபோன்ற சில "ஸ்மார்ட்" உள்ளீட்டை உள்ளிடலாம்:

பயனர் உள்ளீடு:

UserId: 105 OR 1=1

பின்னர், SQL அறிக்கை இப்படித் தோற்றமளிக்கும்:

இதன் விளைவாக வரும் SQL:

SELECT * FROM Users WHERE UserId = 105 OR 1=1;

மேலே உள்ள SQL செல்லுபடியாகும் மற்றும் "Users" அட்டவணையிலிருந்து அனைத்து வரிசைகளையும் திருப்பித் தரும், ஏனெனில் OR 1=1 எப்போதும் TRUE ஆகும்.

🔓 பாதுகாப்பு மீறல்:

மேலே உள்ள உதாரணம் ஆபத்தாகத் தெரிகிறதா? "Users" அட்டவணையில் பெயர்கள் மற்றும் கடவுச்சொற்கள் இருந்தால் என்ன செய்வது? ஒரு ஹேக்கர் வெறுமனே 105 OR 1=1 உள்ளீட்டுப் புலத்தில் செருகுவதன் மூலம் ஒரு தரவுத்தளத்தில் உள்ள அனைத்து பயனர் பெயர்கள் மற்றும் கடவுச்சொற்களுக்கும் அணுகலைப் பெறலாம்.

""="" அடிப்படையிலான SQL Injection எப்போதும் உண்மை

ஒரு வலைத்தளத்தில் பயனர் உள்நுழைவின் உதாரணம் இங்கே:

சாதாரண உள்நுழைவு:

Username: John Doe
Password: myPass

சர்வர் குறியீடு:

uName = getRequestString("username");
uPass = getRequestString("userpassword");

sql = 'SELECT * FROM Users WHERE Name ="' + uName + '" AND Pass ="' + uPass + '"'

முடிவு:

SELECT * FROM Users WHERE Name ="John Doe" AND Pass ="myPass"

ஒரு ஹேக்கர் பயனர் பெயர் அல்லது கடவுச்சொல் உரை பெட்டியில் " OR ""=" செருகுவதன் மூலம் ஒரு தரவுத்தளத்தில் பயனர் பெயர்கள் மற்றும் கடவுச்சொற்களுக்கு அணுகலைப் பெறலாம்:

ஹேக்கர் உள்ளீடு:

User Name: " or ""="
Password: " or ""="

சர்வரில் உள்ள குறியீடு இப்படி ஒரு செல்லுபடியாகும் SQL அறிக்கையை உருவாக்கும்:

முடிவு:

SELECT * FROM Users WHERE Name ="" or ""="" AND Pass ="" or ""=""

மேலே உள்ள SQL செல்லுபடியாகும் மற்றும் "Users" அட்டவணையிலிருந்து அனைத்து வரிசைகளையும் திருப்பித் தரும், ஏனெனில் OR ""="" எப்போதும் TRUE ஆகும்.

தொகுக்கப்பட்ட SQL அறிக்கைகளின் அடிப்படையிலான SQL Injection

பெரும்பாலான தரவுத்தளங்கள் தொகுக்கப்பட்ட SQL அறிக்கைகளை ஆதரிக்கின்றன.

SQL அறிக்கைகளின் தொகுப்பு என்பது இரண்டு அல்லது அதற்கு மேற்பட்ட SQL அறிக்கைகளின் குழுவாகும், அவை அரைப்புள்ளிகளால் பிரிக்கப்படுகின்றன.

கீழே உள்ள SQL அறிக்கை "Users" அட்டவணையிலிருந்து அனைத்து வரிசைகளையும் திருப்பித் தரும், பின்னர் "Suppliers" அட்டவணையை நீக்கும்.

ஆபத்தான SQL:

SELECT * FROM Users; DROP TABLE Suppliers

பின்வரும் உதாரணத்தைப் பாருங்கள்:

சர்வர் குறியீடு:

txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;

பின்வரும் உள்ளீடு:

ஹேக்கர் உள்ளீடு:

User id: 105; DROP TABLE Suppliers

செல்லுபடியாகும் SQL அறிக்கை இப்படித் தோற்றமளிக்கும்:

முடிவு:

SELECT * FROM Users WHERE UserId = 105; DROP TABLE Suppliers;

பாதுகாப்பிற்கான SQL அளவுருக்களைப் பயன்படுத்துதல்

ஒரு வலைத்தளத்தை SQL injection இலிருந்து பாதுகாக்க, நீங்கள் SQL அளவுருக்களைப் பயன்படுத்தலாம்.

SQL அளவுருக்கள் என்பது கட்டுப்படுத்தப்பட்ட முறையில், இயக்க நேரத்தில் ஒரு SQL குவெரியில் சேர்க்கப்படும் மதிப்புகள்.

ASP.NET Razor உதாரணம்

பாதுகாக்கப்பட்ட குறியீடு:

txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = @0";
db.Execute(txtSQL, txtUserId);

💡 குறிப்பு:

அளவுருக்கள் SQL அறிக்கையில் @ குறியீட்டால் குறிப்பிடப்படுகின்றன. SQL இயந்திரம் ஒவ்வொரு அளவுருவையும் அதன் நெடுவரிசைக்கு சரியானதா என்பதை உறுதிப்படுத்துகிறது மற்றும் இயக்கப்பட வேண்டிய SQL-ன் ஒரு பகுதியாக அல்ல, நேரடியாகவே கருதப்படுகின்றன.

மற்றொரு உதாரணம்

INSERT உதாரணம்:

txtNam = getRequestString("CustomerName");
txtAdd = getRequestString("Address");
txtCit = getRequestString("City");
txtSQL = "INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)";
db.Execute(txtSQL, txtNam, txtAdd, txtCit);

பாதுகாப்பு உதாரணங்கள்

பின்வரும் உதாரணங்கள் சில பொதுவான வலை மொழிகளில் அளவுருக்கள் குவெரிகளை எவ்வாறு உருவாக்குவது என்பதைக் காட்டுகின்றன.

ASP.NET-ல் SELECT

txtUserId = getRequestString("UserId");
sql = "SELECT * FROM Customers WHERE CustomerId = @0";
command = new SqlCommand(sql);
command.Parameters.AddWithValue("@0", txtUserId);
command.ExecuteReader();

ASP.NET-ல் INSERT

txtNam = getRequestString("CustomerName");
txtAdd = getRequestString("Address");
txtCit = getRequestString("City");
txtSQL = "INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)";
command = new SqlCommand(txtSQL);
command.Parameters.AddWithValue("@0", txtNam);
command.Parameters.AddWithValue("@1", txtAdd);
command.Parameters.AddWithValue("@2", txtCit);
command.ExecuteNonQuery();

PHP-ல் INSERT

$stmt = $dbh->prepare("INSERT INTO Customers (CustomerName,Address,City) 
VALUES (:nam, :add, :cit)");
$stmt->bindParam(':nam', $txtNam);
$stmt->bindParam(':add', $txtAdd);
$stmt->bindParam(':cit', $txtCit);
$stmt->execute();

SQL Injection தடுப்பு சிறந்த நடைமுறைகள்

அளவுருக்கள் குவெரிகள்

  • எப்போதும் அளவுருக்கள் குவெரிகளைப் பயன்படுத்தவும்
  • நேரடி SQL சரங்களைத் தவிர்க்கவும்
  • தானாகவே தரவை தப்பெண்ணத் தவிர்க்கிறது
  • அனைத்து முக்கிய தரவுத்தளங்களிலும் வேலை செய்கிறது

அணுகல் கட்டுப்பாடு

  • குறைந்தபட்ச அணுகல் கொள்கையைப் பயன்படுத்தவும்
  • READ ONLY கணக்குகளைப் பயன்படுத்தவும்
  • STORED PROCEDURES-ஐப் பயன்படுத்தவும்
  • வழமையாக அனுமதிகளை மதிப்பாய்வு செய்யவும்

உள்ளீடு சரிபார்ப்பு

  • அனைத்து பயனர் உள்ளீட்டையும் சரிபார்க்கவும்
  • வெள்ளை பட்டியல் அடிப்படையில் சரிபார்க்கவும்
  • தேவையற்ற எழுத்துக்களை அகற்றவும்
  • தரவு வகைகளை உறுதிப்படுத்தவும்

பயிற்சி

SQL injection என்றால் என்ன?

SQL குவெரிகளை மேம்படுத்துவதற்கான ஒரு நுட்பம்
✗ தவறு! SQL injection குவெரி மேம்பாட்டு நுட்பம் அல்ல, இது பாதுகாப்பு மீறல் நுட்பமாகும்
ஒரு தரவுத்தளத்தை அணுக அல்லது அழிக்க குறியீடு உட்செலுத்தும் நுட்பம்
✓ சரி! SQL injection என்பது ஒரு குறியீடு உட்செலுத்தும் நுட்பமாகும், இது தீங்கிழைக்கும் SQL குறியீட்டை வலைப் பயன்பாடுகளில் உட்செலுத்துவதன் மூலம் தரவுத்தளங்களை அணுக அல்லது அழிக்கப் பயன்படுகிறது
SQL குவெரிகளை ஹேக்கிங் இலிருந்து பாதுகாக்கும் ஒரு முறை
✗ தவறு! SQL injection ஒரு தாக்குதல் நுட்பமாகும், பாதுகாப்பு முறை அல்ல
SQL குவெரிகளுக்கான ஒரு பிழைத்திருத்த செயல்முறை
✗ தவறு! SQL injection பிழைத்திருத்தம் அல்ல, இது பாதுகாப்பு மீறல் நுட்பமாகும்